using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;

namespace VirtualFileExplorer
{
    public partial class VirtualFileListForm : Form
    {
        // 存储所有文件的完整路径（仅在后台加载一次）
        private List<string> _allFilePaths = new List<string>();
        
        // 缓存文件图标（避免重复提取，提升性能）
        private Dictionary<string, int> _iconCache = new Dictionary<string, int>();
        private ImageList _fileIcons;

        public VirtualFileListForm()
        {
            InitializeComponent();
            InitializeListView();
            InitializeImageList();
        }

        // 初始化ListView为虚拟模式
        private void InitializeListView()
        {
            listView1.View = View.Details;
            listView1.FullRowSelect = true;
            listView1.GridLines = true;
            listView1.VirtualMode = true; // 启用虚拟模式
            listView1.VirtualListSize = 0; // 初始无数据
            
            // 添加列
            listView1.Columns.Add("名称", 200);
            listView1.Columns.Add("类型", 150);
            listView1.Columns.Add("大小", 100, HorizontalAlignment.Right);
            listView1.Columns.Add("修改日期", 180);
            
            // 关联虚拟模式事件
            listView1.RetrieveVirtualItem += ListView1_RetrieveVirtualItem;
            listView1.SearchForVirtualItem += ListView1_SearchForVirtualItem;
            //listView1.VirtualItemsSelectionRangeChanged += ListView1_VirtualItemsSelectionRangeChanged;
        }

        // 初始化图标列表（用于缓存文件图标）
        private void InitializeImageList()
        {
            _fileIcons = new ImageList();
            _fileIcons.ImageSize = new Size(16, 16);
            _fileIcons.ColorDepth = ColorDepth.Depth32Bit;
            listView1.SmallImageList = _fileIcons;

            // 添加默认文件夹和文件图标
            _fileIcons.Images.Add("folder", SystemIcons.Error.ToBitmap());
            _fileIcons.Images.Add("file", SystemIcons.Hand.ToBitmap());
            _iconCache["folder"] = 0;
            _iconCache["file"] = 1;
        }

        // 加载指定目录的文件（核心优化：后台加载）
        public async void LoadDirectory(string path)
        {
            if (!Directory.Exists(path))
            {
                MessageBox.Show("目录不存在！");
                return;
            }

            // 显示加载提示
            statusLabel.Text = "正在加载文件...";
            listView1.VirtualListSize = 0; // 清空现有数据

            try
            {
                // 后台线程获取所有文件路径（仅获取路径，不读取详细信息）
                _allFilePaths = await Task.Run(() =>
                {
                    var files = new List<string>();
                    //var dirs = new List<string>();
                    // 添加文件夹
                    string[] dirs=Directory.GetDirectories(path);
                    foreach (var dir in dirs)
                    {
                        string[] filess=Rename.Util.FileHelper.GetFileNames(dir,"*",true);
                        // 添加文件
                        foreach (var file in filess)
                        {
                            files.Add(file);
                        }
                    }
                    return files;
                });

                // 更新虚拟列表大小（触发RetrieveVirtualItem事件）
                listView1.VirtualListSize = _allFilePaths.Count;
                statusLabel.Text = $"已加载 {_allFilePaths.Count} 项";
            }
            catch (Exception ex)
            {
                statusLabel.Text = "加载失败";
                MessageBox.Show($"加载错误: {ex.Message}");
            }
        }

        // 虚拟模式核心：动态获取可见项数据
        private void ListView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            // e.ItemIndex 是当前需要显示的项索引
            if (e.ItemIndex < 0 || e.ItemIndex >= _allFilePaths.Count)
                return;

            string fullPath = _allFilePaths[e.ItemIndex];
            var item = new ListViewItem();

            try
            {
                if (Directory.Exists(fullPath))
                {
                    // 处理文件夹
                    var dirInfo = new DirectoryInfo(fullPath);
                    item.Text = dirInfo.Name;
                    item.SubItems.Add("文件夹");
                    item.SubItems.Add(""); // 文件夹无大小
                    item.SubItems.Add(dirInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"));
                    item.ImageIndex = _iconCache["folder"];
                    item.Tag = fullPath;
                }
                else if (File.Exists(fullPath))
                {
                    // 处理文件（按需读取信息，只在显示时读取）
                    var fileInfo = new FileInfo(fullPath);
                    item.Text = fileInfo.Name;
                    
                    // 获取文件类型和图标（使用缓存）
                    string extension = Path.GetExtension(fullPath).ToLower();
                    item.SubItems.Add(GetFileTypeDescription(extension));
                    item.ImageIndex = GetFileIconIndex(extension);
                    
                    // 格式化文件大小
                    item.SubItems.Add(fileInfo.Length >= 1024 
                        ? $"{(fileInfo.Length / 1024.0):N2} KB" 
                        : $"{fileInfo.Length} B");
                    
                    item.SubItems.Add(fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"));
                    item.Tag = fullPath;
                }
            }
            catch
            {
                // 处理无权限访问的文件/文件夹
                item.Text = Path.GetFileName(fullPath);
                item.SubItems.Add("无法访问");
                item.SubItems.Add("");
                item.SubItems.Add("");
                item.ImageIndex = -1;
            }

            e.Item = item;
        }

        // 搜索功能（虚拟模式下需手动实现）
        private void ListView1_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
        {
            // 简单的名称包含搜索
            string searchText = e.Text.ToLower();
            for (int i = 0; i < _allFilePaths.Count; i++)
            {
                if (Path.GetFileName(_allFilePaths[i]).ToLower().Contains(searchText))
                {
                    e.Index = i;
                    return;
                }
            }
            e.Index = -1; // 未找到
        }

        // 处理选择事件（可选）
        //private void ListView1_VirtualItemsSelectionRangeChanged(object sender, VirtualItemsSelectionRangeChangedEventArgs e)
        //{
        //    // 可在这里处理选中项变化逻辑
        //}

        // 获取文件类型描述（使用缓存）
        private string GetFileTypeDescription(string extension)
        {
            if (string.IsNullOrEmpty(extension))
                return "文件";

            // 简单类型映射，实际应用可从注册表获取系统定义
            var typeMap = new Dictionary<string, string>
            {
                { ".txt", "文本文件" },
                { ".jpg", "JPEG图像" },
                { ".png", "PNG图像" },
                { ".docx", "Word文档" },
                { ".xlsx", "Excel表格" },
                { ".pdf", "PDF文档" }
            };

            return typeMap.TryGetValue(extension, out var desc) ? desc : $"{extension}文件";
        }

        // 获取文件图标索引（使用缓存避免重复提取）
        private int GetFileIconIndex(string extension)
        {
            if (_iconCache.TryGetValue(extension, out int index))
                return index;

            // 提取并缓存新图标
            try
            {
                using (var tempFile = new TempFile(extension))
                {
                    Icon icon = Icon.ExtractAssociatedIcon(tempFile.Path);
                    _fileIcons.Images.Add(extension, icon.ToBitmap());
                    index = _fileIcons.Images.Count - 1;
                    _iconCache[extension] = index;
                    return index;
                }
            }
            catch
            {
                // 提取失败时使用默认文件图标
                return _iconCache["file"];
            }
        }

        // 双击项事件（进入文件夹或打开文件）
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            if (listView1.SelectedIndices.Count == 0)
                return;

            int selectedIndex = listView1.SelectedIndices[0];
            string path = _allFilePaths[selectedIndex];
            
            if (Directory.Exists(path))
            {
                // 进入子文件夹
                LoadDirectory(path);
            }
            else if (File.Exists(path))
            {
                // 用系统默认程序打开文件
                try
                {
                    System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(path)
                    {
                        UseShellExecute = true
                    });
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"无法打开文件: {ex.Message}");
                }
            }
        }

        // 临时文件辅助类（用于提取图标）
        private class TempFile : IDisposable
        {
            public string Path { get; }
            public TempFile(string extension)
            {
                Path = System.IO.Path.GetTempFileName() + extension;
                File.Create(Path).Dispose(); // 创建空文件
            }
            public void Dispose()
            {
                if (File.Exists(Path))
                    File.Delete(Path);
            }
        }

        // 设计器生成的控件（简化版）
        private ListView listView1;
        private Label statusLabel;

        private void InitializeComponent()
        {
            listView1 = new ListView();
            statusLabel = new Label();
            SuspendLayout();
            
            // listView1
            listView1.Dock = DockStyle.Fill;
            listView1.Location = new Point(0, 0);
            listView1.Name = "listView1";
            listView1.Size = new Size(800, 420);
            listView1.TabIndex = 0;
            listView1.DoubleClick += listView1_DoubleClick;
            
            // statusLabel
            statusLabel.Dock = DockStyle.Bottom;
            statusLabel.Height = 30;
            statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
            statusLabel.TabIndex = 1;
            
            // VirtualFileListForm
            ClientSize = new Size(800, 450);
            Controls.Add(listView1);
            Controls.Add(statusLabel);
            Text = "虚拟模式文件浏览器";
            ResumeLayout(false);
        }
    }

    // 使用示例
    //static class Program
    //{
    //    [STAThread]
    //    static void Main()
    //    {
    //        Application.EnableVisualStyles();
    //        Application.SetCompatibleTextRenderingDefault(false);
    //        var form = new VirtualFileListForm();
    //        // 加载系统桌面目录
    //        form.LoadDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
    //        Application.Run(form);
    //    }
    //}
}
